cli-utils.ts ➔ fromPackageEnv   A
last analyzed

Complexity

Conditions 4

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 7
dl 0
loc 10
rs 10
c 0
b 0
f 0
1
const argStart = 2
2
, argPrefix = "--env-file="
3
, {"length": argPrefixLength} = argPrefix
4
, packagePrefix = "npm_package_config_env_file"
5
, envPrefix = "ENV_FILE"
6
7
/**
8
 * @see https://github.com/npm/cli/issues/3775
9
 * @see https://github.com/npm/run-script/issues/37 */
10
const npm7delimiter = "\n\n"
11
12
export {
13
  fromArgs,
14
  fromPackageEnv,
15
  fromEnv
16
}
17
18
function fromArgs<T extends boolean>(
19
  argv: typeof process["argv"],
20
  deleteThem: T
21
) {
22
  const {length} = argv
23
  // CONSIDER `collected: Set<string>`
24
  , collected: string[] = []
25
  , indexesToDelete = deleteThem ? [] as number[] : undefined
26
27
  for (let i = argStart; i < length; i++) {
28
    const arg = argv[i]
29
30
    if (!arg.startsWith(argPrefix))
31
      continue
32
33
    collected.push(arg.substr(argPrefixLength))
34
    deleteThem && indexesToDelete!.push(i)
35
  }
36
37
  const lengthToDelete = indexesToDelete?.length
38
39
  if (lengthToDelete) {
40
    let deleteIndex = 0
41
    , curIndex = indexesToDelete[0]
42
43
    for (let preIndex = curIndex; preIndex < length; preIndex++) {
44
      while (preIndex === indexesToDelete[deleteIndex]) {
45
        preIndex++
46
        deleteIndex++
47
      }
48
49
      argv[curIndex] = argv[preIndex]
50
      curIndex++
51
    }
52
53
    argv.length -= lengthToDelete
54
  }
55
56
  return collected
57
}
58
59
/**
60
 * @todo Consider calculation as in compose.yml
61
 */
62
function fromPackageEnv(env: Readonly<Env>) {
63
  return fromArrayAsAssoc(
64
    env,
65
    packagePrefix,
66
    env[packagePrefix]?.split(npm7delimiter) ?? []
67
  )
68
}
69
70
function fromEnv(env: Readonly<Env>) {
71
  return fromArrayAsAssoc(
72
    env,
73
    envPrefix,
74
    envPrefix in env
75
    ? [env[envPrefix]!]
76
    : []
77
  )
78
}
79
80
// CONSIDER `collected: Set<string>`
81
function fromArrayAsAssoc(env: Readonly<Env>, prefix: string, collected: string[]) {
82
  let i = 0
83
  , key = `${prefix}_${i}`
84
85
  while (key in env) {
86
    collected.push(env[key]!)
87
    i++
88
    key = `${prefix}_${i}`
89
  }
90
91
  return collected
92
}
93